home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_06_07 / v6n7074b.txt < prev    next >
Text File  |  1989-09-26  |  4KB  |  157 lines

  1. /* C device driver header */
  2.  
  3. #ifndef I8086D
  4. int x = WRONG_MEMORY_MODEL;
  5. #endif
  6.  
  7. /* byte has been misspelled to prevent a conflict with DOS.H */
  8.  
  9. typedef unsigned char bite;
  10. typedef unsigned int word;
  11.  
  12. #ifndef NULL
  13. #define NULL 0L
  14. #endif
  15.  
  16. /* format of device header */
  17.  
  18. struct device_header {
  19.   struct device_header *next;
  20.   word attributes;
  21.   word strategy_entry;
  22.   word interrupt_entry;
  23.   char name[8];
  24.   };
  25.  
  26. /* device header attributes */
  27.  
  28. #define CHAR_DEVICE_ATTRIBUTE     0x8000
  29. #define STI_DEVICE_ATTRIBUTE      0x0001
  30. #define STO_DEVICE_ATTRIBUTE      0x0002
  31. #define NUL_DEVICE_ATTRIBUTE      0x0004
  32. #define CLOCK_DEVICE_ATTRIBUTE    0x0008
  33. #define SPECIAL_ATTRIBUTE         0x0010
  34. #define IOCTL_ATTRIBUTE           0x4000
  35. #define NON_IBM_FORMAT_ATTRIBUTE  0x2000
  36.  
  37. /* format of BPB (block devices only) */
  38.  
  39. struct bpb {
  40.   word bytes_per_sector;
  41.   bite sectors_per_allocation_unit;
  42.   word reserved_sectors;
  43.   bite FATs;
  44.   word root_directory_entries;
  45.   word total_sectors;
  46.   bite media_descriptor;
  47.   word sectors_per_FAT;
  48.   word sectors_per_track;
  49.   word heads;
  50.   word hidden_sectors;
  51.   };
  52.   
  53. /* format of request header and functional data */
  54.  
  55. struct request_header {
  56.   bite length;
  57.   bite unit_code;
  58.   bite command_code;
  59.   int status;
  60.   bite reserved[8];
  61.   union {
  62.     struct {
  63.       bite number_of_units;
  64.       char *end_of_driver;
  65.       union {
  66.         char *command_line;
  67.         struct bpb **bpb_table;
  68.         } pointer;
  69.       } init ;
  70.     struct {
  71.       bite media_descriptor;
  72.       bite returned;
  73.       } media_check ;
  74.     struct {
  75.       bite media_descriptor;
  76.       char *transfer_address;
  77.       struct bpb *bpb;
  78.       } build_bpb ;
  79.     struct {
  80.       bite media_descriptor;
  81.       char *transfer_address;
  82.       word count;
  83.       word starting_sector;
  84.       } io ; /* for ioctl_input
  85.                     input
  86.                     output
  87.                     output_with_verify
  88.                     ioctl_output        */
  89.     struct {
  90.       bite character;
  91.       } nondestructive_input ;
  92.     } x;
  93.   };
  94.  
  95. /* structure used by date_and_time() function */
  96.  
  97. struct date_and_time {
  98.   word days;
  99.   bite minutes;
  100.   bite hours;
  101.   bite hundredths;
  102.   bite seconds;
  103.   };
  104.  
  105. /* status bits returned by driver */
  106.  
  107. #define ERROR_STATUS  0x8000
  108. #define BUSY_STATUS   0x0200
  109. #define DONE_STATUS   0x0100
  110.  
  111. /* error numbers added to ERROR_STATUS */
  112.  
  113. #define WRITE_PROTECT_VIOLATION             0
  114. #define UNKNOWN_UNIT                        1
  115. #define DRIVE_NOT_READY                     2
  116. #define UNKNOWN_COMMAND                     3
  117. #define CRC_ERROR                           4
  118. #define BAD_DRIVE_REQUEST_STRUCTURE_LENGTH  5
  119. #define SEEK_ERROR                          6
  120. #define UNKNOWN_MEDIA                       7
  121. #define SECTOR_NOT_FOUND                    8
  122. #define PRINTER_OUT_OF_PAPER                9
  123. #define WRITE_FAULT                         10
  124. #define READ_FAULT                          11
  125. #define GENERAL_FAILURE                     12
  126.  
  127. /* functions that must be defined in driver */
  128.  
  129. extern void init(void);
  130. extern void media_check(void);
  131. extern void build_bpb(void);
  132. extern void ioctl_input(void);
  133. extern void input(void);
  134. extern void nondestructive_input(void);
  135. extern void input_status(void);
  136. extern void input_flush(void);
  137. extern void output(void);
  138. extern void output_with_verify(void);
  139. extern void output_status(void);
  140. extern void output_flush(void);
  141. extern void ioctl_output(void);
  142.  
  143. /* external items defined in startup code */
  144.  
  145. extern void bad_device_driver_function(void);
  146. extern struct request_header *request_header;
  147. extern struct device_header *device_header;
  148. extern void exit(void);
  149.  
  150. /* external items defined in other modules */
  151.  
  152. extern int date_and_time(struct date_and_time *);
  153. extern void call_driver(struct device_header *, struct request_header *);
  154. extern char *argument(int);
  155. extern void putchar(int);
  156. extern void puts(char *);
  157.